package org.abc.fund.config.ScheduleUpdateConfig;
import lombok.extern.slf4j.Slf4j;
import org.abc.fund.service.dataSourceCollection.FundHoldingBatchService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
@Configuration
@EnableScheduling
@Slf4j
public class FundHoldingScheduleConfig {
    @Autowired
    private FundHoldingBatchService holdingBatchService;

    /**
     * 季度持仓更新 - 在季度报告发布后执行
     * 2月、5月、8月、11月的第20天凌晨2点
     * （给基金公司发布报告留出时间）
     */
    @Scheduled(cron = "0 0 2 20 2,5,8,11 ?")
    public void quarterlyHoldingSchedule() {
        log.info("=== 定时任务：季度持仓更新开始 ===");
        try {
            holdingBatchService.fetchQuarterlyHoldings();
            log.info("=== 定时任务：季度持仓更新完成 ===");
        } catch (Exception e) {
            log.error("=== 定时任务：季度持仓更新失败 ===", e);
        }
    }

    /**
     * 半年度持仓更新 - 在半年度报告发布后执行
     * 9月和3月的第25天凌晨3点
     */
    @Scheduled(cron = "0 0 3 25 3,9 ?")
    public void semiAnnualHoldingSchedule() {
        log.info("=== 定时任务：半年度持仓更新开始 ===");
        try {
            holdingBatchService.fetchSemiAnnualHoldings();
            log.info("=== 定时任务：半年度持仓更新完成 ===");
        } catch (Exception e) {
            log.error("=== 定时任务：半年度持仓更新失败 ===", e);
        }
    }

    /**
     * 年度持仓更新 - 在年度报告集中发布期后执行
     * 5月第10天凌晨4点
     */
    @Scheduled(cron = "0 0 4 10 5 ?")
    public void annualHoldingSchedule() {
        log.info("=== 定时任务：年度持仓更新开始 ===");
        try {
            holdingBatchService.fetchAnnualHoldings();
            log.info("=== 定时任务：年度持仓更新完成 ===");
        } catch (Exception e) {
            log.error("=== 定时任务：年度持仓更新失败 ===", e);
        }
    }

    /**
     * 持仓数据清理 - 每年执行一次
     * 1月1日凌晨5点，清理3年前的旧数据
     */
    @Scheduled(cron = "0 0 5 1 1 ?")
    public void holdingDataCleanupSchedule() {
        log.info("=== 定时任务：持仓数据清理开始 ===");
        try {
            holdingBatchService.cleanupOldHoldings();
            log.info("=== 定时任务：持仓数据清理完成 ===");
        } catch (Exception e) {
            log.error("=== 定时任务：持仓数据清理失败 ===", e);
        }
    }
}